const { TokenStatus, DB_Transaction_Same_Doc, GetTokenType } = require("../../../constEnum");
const { transactionUpdate } = require("../../../db");
const { util } = require("utils");
const { handleLoading } = require("./sub/tokenLoading");

// 修改数据库 , 然后去 请求新的token
async function changeToLoading(cache) {
    let docId = cache._id;
    let requestCount = cache.requestCount || 0;
    // 开启事务 更新状态
    let update = {
        requestCount: requestCount + 1,
        tokenStatus: TokenStatus.loading,
    };
    // 开启事务,  修改token的状态
    let [err, data] = await transactionUpdate(docId, update);
    if (!util.nilValue(err)) {
        let { code } = err || {};
        if (DB_Transaction_Same_Doc.indexOf(code) >= 0) {
            // 说明已经有 实例 修改了, 等待就好了
            return await handleLoading(docId);
        } else {
            return [err, null];
        }
    }
    // 判断 更新的条数
    let { updated } = data || {};
    if (updated === 0) {
        // 更新的时候,  会不会出现 ,  await 2个事务, 都改同一条,
        // 然后 1个事务 快, 立刻 commit, 然后 另一个事务 也成功了?

        // 如果更新的条数 为 0, 说明 事务 提交成功, 但是 数据 没有改变
        return await handleLoading(docId);
    }

    // 修改 成功了,  要去 请求了
    return [null, { flag: false, message: "要请求新的哦", doc: cache, type: GetTokenType.getNew }];
}

module.exports = {
    changeToLoading,
};
